#include "stdafx.h"
#include "XLabelImpl.h"

#include "Util.h"
#include "UIUtil.h"
#include "DrawUtil.h"

#include "IntSkinImpl.h"

template <class I>
CXLabelImpl<I>::CXLabelImpl()
{
    m_bRichText = FALSE;
}

template <class I>
CXLabelImpl<I>::~CXLabelImpl()
{
}

//////////////////////////////////////////////////////////////////////////
// IXLabel
template <class I>
void CXLabelImpl<I>::put_RichText(IN LPCTSTR szRichText)
{
    XString strText, strTextResId;
    IntSkinImpl::SetorLoadStringSaveResId(szRichText, strText, strTextResId);
    if(m_TextParser.IsRichText(strText.GetData()))
    {
        m_bRichText = TRUE;
        if(m_strRichText != szRichText)
        {
            m_strRichText = strText;
            m_strRichTextResId = strTextResId;

            m_TextParser.Parse(m_strRichText.GetData());
            m_strText = m_TextParser.GetPlainText();
            Invalidate();
            AutoSizeImpl(FALSE);
        }
    }
    else
    {
        put_Text(szRichText);
    }
}

template <class I>
HRESULT CXLabelImpl<I>::get_RichText(OUT BSTR* pbstrRichText)
{
    if(::SysReAllocString(pbstrRichText, m_strRichText.GetData()))
        return m_bRichText ? S_OK : S_FALSE;

    return E_FAIL;
}

//////////////////////////////////////////////////////////////////////////
// IXFrame

template <class I>
void CXLabelImpl<I>::Draw(XCANVAS xCanvas, const RECT& rcDraw)
{
    superclass::Draw(xCanvas, rcDraw);

    RECT rcText;
    get_WindowRect(&rcText);

    int nLeft = 0, nTop = 0, nRight = 0, nBottom = 0;
    get_Padding(&nLeft, &nTop, &nRight, &nBottom);

    rcText.left += nLeft;
    rcText.top += nTop;
    rcText.right -= nRight;
    rcText.bottom -= nBottom;

    if(m_bRichText)
    {
        m_TextParser.Draw((HDC)xCanvas, &rcText, GetControlFlags());
    }
    else if(!m_strText.empty())
    {
        IXFont* pFont = NULL;
        IXTextEnv* pTextEnv = NULL;

        get_Font(&pFont);
        get_TextEnv(&pTextEnv);

        DrawUtil::XDrawText(xCanvas, m_strText, m_strText.Length(), &rcText, pTextEnv, pFont);
    }
}

//////////////////////////////////////////////////////////////////////////
// IXControl

template <class I>
void CXLabelImpl<I>::GetAutoSize(OUT LPSIZE pAutoSize)
{
    if(m_bRichText)
        m_TextParser.GetAutoSize(pAutoSize);
    else
        superclass::GetAutoSize(pAutoSize);
}

template <class I>
HRESULT CXLabelImpl<I>::put_Text(IN LPCTSTR szText)
{
    XDIAG_ENSURE_MAIN_THREAD();
    m_bRichText = FALSE;
    return superclass::put_Text(szText);
}

template <class I>
void CXLabelImpl<I>::put_MaxSize(int nWidth, int nHeight)
{
    superclass::put_MaxSize(nWidth, nHeight);
    m_TextParser.SetMaxSize(nWidth, nHeight);
}

//////////////////////////////////////////////////////////////////////////
// IXBaseObj
template <class I>
void CXLabelImpl<I>::OnConstruct()
{
    superclass::OnConstruct();
    IXTextEnv* pTextEnv = UIUtil::XGetTextEnv(this);
    DWORD dwFlags = pTextEnv->get_DrawFlags();
    pTextEnv->put_DrawFlags(dwFlags & (~DT_CENTER));
}

//////////////////////////////////////////////////////////////////////////
// CXControlImpl
template <class I>
HRESULT CXLabelImpl<I>::OnSkinLangChanged()
{
    superclass::OnSkinLangChanged();
    XString strRichText;
    XString strRichTextResId = m_strRichTextResId;
    if(IntSkinImpl::ReLoadString(m_strRichTextResId.c_str(), strRichText))
    {
        put_RichText(strRichText.c_str());
        m_strRichTextResId = strRichTextResId;
    }
    return S_OK;
}